#!/bin/bash

function verificar_archivo_carpeta()
{
 eval path=$1
 if [ -d $path -o -f $path ];
  then
   resv_a_c=0
  else
   resv_a_c=1
 fi
 return $resv_a_c
}

function verificar_carpetas_de_instalacion()
{
 resv_c_i=0
 GRUPO=`echo | cat $CONFIGDIR/$ARCH_CONF | grep "GRUPO=" | cut -d "=" -f 2`
 for arch in `echo | cat $CONFIGDIR/$ARCH_CONF | cut -d "=" -f 2`
  do
   `echo $arch | grep "DIR="`
   if [ $? -eq 0 ]; 
    then
     verificar_archivo_carpeta $arch
     if [ $? -ne 0 ];
      then 
       agregar_elemento_faltante $arch
       resv_c_i=1
     fi
   fi
  done
 return $resv_c_i
}

function verificar_scripts()
{
 resv_s=0
 carpeta_scripts=`echo | cat $CONFIGDIR/$ARCH_CONF | grep "BINDIR=" | cut -d "=" -f 2`
 if [ "$carpeta_scripts" == "" ];
  then 
   resv_s=1
  else
   for script in `echo $SCRIPTS | tr "," "\n"`
    do
     verificar_archivo_carpeta "$carpeta_scripts/$script"
     if [ $? -ne 0 ];
      then
       agregar_elemento_faltante "$carpeta_scripts/$script"
       resv_s=1
     fi
    done
 fi
 return $resv_s
}

function verificar_archivos_maestros()
{
  resv_a_m=0
  eval  carp_arch_maestros=`echo | cat $CONFIGDIR/$ARCH_CONF | grep "MAEDIR=" | cut -d "=" -f 2`
  if [ ! -f $carp_arch_maestros/"salas.mae" ];
   then
    resv_a_m=1
    agregar_elemento_faltante $carp_arch_maestros/"salas.mae"
  fi   
  if [ ! -f $carp_arch_maestros/"obras.mae" ];
   then
    resv_a_m=1
    agregar_elemento_faltante $carp_arch_maestros/"obras.mae"
  fi

  eval carp_arch_disponibilidad=`echo | cat $CONFIGDIR/$ARCH_CONF | grep "PROCDIR=" | cut -d "=" -f 2`
  if [ ! -f $carp_arch_disponibilidad/"combos.dis" ];
   then
    resv_a_m=1
    agregar_elemento_faltante $carp_arch_disponibilidad/"combos.dis"
  fi
 
  return $resv_a_m
}

function agregar_elemento_faltante()
{
 eval elemento_faltante=$1
 if [[ $ELEMENTOS_FALTANTES == "" ]]; 
  then
   ELEMENTOS_FALTANTES="$elemento_faltante"
  else
   ELEMENTOS_FALTANTES="$ELEMENTOS_FALTANTES, $elemento_faltante"
 fi
}

function verificar_instalacion()
{
 # si falta el archivo de configuracion, es un error severo y no puede continuar la ejecucion
 verificar_archivo_carpeta "$CONFIGDIR"
 if [ $? -ne 0 ];
  then
   agregar_elemento_faltante "$CONFIGDIR"
   mostrar_msg_error_instalacion
 fi
 
 verificar_archivo_carpeta "$CONFIGDIR/$ARCH_CONF"
 if [ $? -ne 0 ]
  then
   agregar_elemento_faltante "$CONFIGDIR/$ARCH_CONF"
   mostrar_msg_error_instalacion
 fi

 verificar_carpetas_de_instalacion 
 if [ $? -ne 0 ]
  then 
   resv_i=1
 fi

 verificar_scripts
 if [ $? -ne 0 ]
  then
   resv_i=1
 fi
 
 verificar_archivos_maestros
 if [ $? -ne 0 ]
  then
   resv_i=1
 fi

 return $resv_i
}

function verificar_si_existe_en_path()
{
 resv_e_p=0
 eval contenido_de_variable='$'$1

 echo $PATH | grep -q $contenido_de_variable
 if [ $? -ne 0 ];
  then
   resv_e_p=1
 fi
 return $resv_e_p
}

function verificar_si_existe_var_de_entorno()
{
 resv_v_e=0
 env | grep -q "$1="
 if [ $? -ne 0 ];
  then
   resv_v_e=1
 fi
 return $resv_v_e
}

function agregar_variable_a_path()
{
 eval ruta='$'$1 
 export PATH=$PATH:$ruta
}

function setear_variable_de_entorno()
{
 eval ruta=$2
 export $1=$ruta
}

# chequea todos los archivos .sh y .pl de la carpeta bin y asigna los permisos
# correspondientes si no los tienen
function setear_permisos_de_scripts()
{
 eval ruta=$BINDIR 
 for i in `ls $ruta | grep ".[ps][lh]\$"`
  do
   ls -l $ruta | grep "$i" | grep -q "x"
   if [ $? -ne 0 ];
    then
     `chmod +x $ruta/$i`
   fi
  done
}

# lee el archivo de configuracion para setear las variables de entorno
function setear_variables_entorno()
{
 for i in `cat $CONFIGDIR/$ARCH_CONF | cut -d "=" -f 1,2`
  do
   nombre_variable=`echo "$i" | cut -d "=" -f 1`
   verificar_si_existe_var_de_entorno $nombre_variable
   if [ $? -ne 0 ];
    then
     ruta=`echo "$i" | cut -d "=" -f 2`
     setear_variable_de_entorno $nombre_variable $ruta
   fi
 done
}

function dar_instrucciones_Start_A()
{
 msg="Para ejecutar el script Recibir_A debera ejecutar el comando \"Start_A.sh Recibir_A.sh\""
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"
}

function dar_instrucciones_Stop_A()
{
 msg="Para detener el script Recibir_A debera ejecutar el comando \"Stop_A.sh Recibir_A.sh\""
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"
}

function preguntar_inicio_de_recibir_a()
{
 obtuvo_respuesta=0
 activar_Recibir_A=0
 msg="Desea efectuar la activacion de Recibir_A? S-N "
 while [ $obtuvo_respuesta -ne 1 ]
 do
  read -n 1 -p "$msg" respuesta
  echo
  echo $respuesta | grep -q "[SsNn]"
  if [ $? -eq 0 ];
   then
    obtuvo_respuesta=1
    ./Grabar_L.sh Iniciar_A "$msg $respuesta"
    echo $respuesta  | grep -q "[Ss]" 
    if [ $? -eq 0 ];
     then
      Start_A.sh Recibir_A.sh
      ./Grabar_L.sh Iniciar_A I "Se inicia el proceso Recibir_A" -p:Start_A
      dar_instrucciones_Stop_A
      activar_Recibir_A=1
     else
      dar_instrucciones_Start_A
    fi
   else
    echo -e "\nrespuesta incorrecta"
  fi 
 done
}

function inicializar_variables()
{
 setear_variables_entorno
 verificar_si_existe_en_path BINDIR
 if [ $? -ne 0 ]
  then
   agregar_variable_a_path BINDIR
 fi
 setear_permisos_de_scripts
}

function mostrar_msg_error_instalacion()
{
 OLDIFS=$IFS
 IFS=","
 for i in $ELEMENTOS_FALTANTES
  do
   msg="No se encuentra $i"
   echo $msg
   ./Grabar_L.sh Iniciar_A SE "$msg"
  done
 IFS=$OLDIFS
 msg="Por favor, lea el archivo readme para reinstalar la aplicacion"
 echo $msg
 ./Grabar_L.sh Iniciar_A I "$msg"

 read -n 1
 ./Grabar_L.sh Iniciar_A "Finalizo incorrectamente"
 exit 1
}

function mostrar_msg_error_ambiente_inicializado()
{
 msg="Ambiente ya inicializado. Si quiere reiniciar, termine la sesion de la terminal que este ejecutando RESER_A e ingrese nuevamente."
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"
 ./Grabar_L.sh Iniciar_A "Finalizo correctamente"
}

function mostrar_msg_inicio_de_ejecucion()
{
 msg="Comando Iniciar_A Inicio de Ejecucion"
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"
}

function obtener_pid()
{
 echo `ps -A | grep "$1" | cut -d "p" -f 1`
}

function mostrar_archivos()
{
 eval carpeta=$1
 msg="Archivos:"
 ./Grabar_L.sh Iniciar_A "$msg"
 for arch in `echo | ls $carpeta`
  do
   msg="$arch"
   echo $msg
    ./Grabar_L.sh Iniciar_A "$msg"
  done
}

function iniciar_ambiente_para_log()
{
 verificar_si_existe_var_de_entorno GRUPO
 if [ $? -ne 0 ];
  then
   eval GRUPO=`echo $PATH_GRUPO`
   export GRUPO
 fi

 CONFIGDIR="$GRUPO/conf"

 if [ -f $CONFIGDIR/$ARCH_CONF ];
  then
   eval LOGDIR=`cat $CONFIGDIR/$ARCH_CONF | grep "LOGDIR=" | cut -d "=" -f 2`
   eval LOGSIZE=`cat $CONFIGDIR/$ARCH_CONF | grep "LOGSIZE=" | cut -d "=" -f 2`
   eval LOGEXT=`cat $CONFIGDIR/$ARCH_CONF | grep "LOGEXT=" | cut -d "=" -f 2`
 fi
 if [[ $LOGDIR == "" ]]; # si no existe
  then
   eval LOGDIR=$GRUPO/LOGDIR
 fi
 if [[ $LOGSIZE == "" ]]; # si no existe
  then
   LOGSIZE=100
 fi
 if [[ $LOGEXT == "" ]]; # si no existe
  then
   LOGEXT=log
 fi

 export LOGDIR
 export LOGSIZE
 export LOGEXT
}

function mostrar_msg_fin()
{
 msg="TP SO7508 Segundo Cuatrimestre 2013. Tema A Copyright Grupo 11"
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"

 msg="Libreria del Sistema: $CONFDIR"
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"
 mostrar_archivos $CONFDIR

 msg="Ejecutables: $BINDIR"
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"
 mostrar_archivos $BINDIR

 echo "Archivos maestros: $MAEDIR"
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"
 mostrar_archivos $MAEDIR

 msg="Directorio de arribo de archivos externos: $ARRIDIR"
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"

 msg="Archivos externos aceptados: $ACEPDIR"
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"

 msg="Archivos externos_rechazados: $RECHDIR"
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"

 msg="Reportes de salida: $REPODIR"
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"

 msg="Archivos procesados: $PROCDIR"
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"

 msg="Logs de auditoria del sistema: $LOGDIR/<comando>.$LOGEXT"
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"

 msg="Estado del sistema: INICIALIZADO"
 echo $msg
 ./Grabar_L.sh Iniciar_A "$msg"

 if [ $activar_Recibir_A -eq 1 ];
  then
   msg="Demonio corriendo bajo el no.: <`obtener_pid "Recibir_A.sh"`>"
   echo $msg
   ./Grabar_L.sh Iniciar_A "$msg"

 fi

 ./Grabar_L.sh Iniciar_A "Finalizo correctamente"
}

function matar_procesos_en_salida()
{
  ps -A | grep -q "RESER_A.sh"
  if [ $? -eq 0 ];
   then
    Stop_A.sh "RESER_A.sh"
  fi

  ps -A | grep -q "Recibir_A.sh"
  if [ $? -eq 0 ];
   then
    Stop_A.sh "Recibir_A.sh"
  fi
}

PATH_GRUPO=`echo ~/grupo11`
CONFIGDIR="$PATH_GRUPO/conf"
ARCH_CONF=Instalar_TP.conf
SCRIPTS=Start_A.sh,Stop_A.sh,Mover_A.sh,Recibir_A.sh
ELEMENTOS_FALTANTES=""

iniciar_ambiente_para_log

mostrar_msg_inicio_de_ejecucion

verificar_instalacion
 if [ $? -ne 0 ];
  then
   mostrar_msg_error_instalacion
   exit 1
 fi

ps -A | grep -q "RESER_A.sh"
 if [ $? -eq 0 ];
  then
   mostrar_msg_error_ambiente_inicializado
  else
   inicializar_variables
   setear_variable_de_entorno INICIALIZADO 1
   preguntar_inicio_de_recibir_a
   mostrar_msg_fin
   # se agrega un proceso que permite identificar que RESER_A esta corriendo, incluso entre terminales distintas
   RESER_A.sh &
   trap matar_procesos_en_salida SIGINT SIGTERM EXIT
 fi
